package ch03.com.friendsofed.isometric
{

	/**
	 * 创建一个带有高度的3D 等角对象（等角体）.
	 *
	   当进入 3D 空间后，就要开始考虑光影了。一个等角体会有三个可视面。为了增强空间感，每
	   个面的光影都会略有不同。通常，光源假设在左上或者右上方，这样一来，上一面会亮一些，
	   左右两面会暗一些，哪个更暗取决于光源在左还是在右。下面的 DrawnIsoBox 类中，我假设
	   光源在右上方，所以左边最暗，右边第二：
	 */
	public class DrawnIsoBox extends DrawnIsoTile
	{

		public function DrawnIsoBox(size:Number, color:uint, height:Number)
		{
			super(size, color, height);
		}

		override protected function draw():void
		{
			graphics.clear();
			var red:int = _color >> 16;
			var green:int = _color >> 8 & 0xff;
			var blue:int = _color & 0xff;

			var leftShadow:uint = (red * .5) << 16 | (green * .5) << 8 | (blue * .5);
			var rightShadow:uint = (red * .75) << 16 | (green * .75) << 8 | (blue * .75);

			/**
			 * 这行是用来转换等角高度的，回忆一下等角变形公式：
			   sx = x - z;
			   sy = y * 1.2247 + (x + z) * .5;
			   我曾提及有些算法忽略了1.2247，而此处我们需要它，否则Box 就像被压扁了似的。比
			   如我们设置大小和高度都是20，期待出现一个正方体时，却出现一块像蛋糕一样的东西。
			 */
			var h:Number = _height * Y_CORRECT;
			// draw top
			graphics.beginFill(_color);
			graphics.lineStyle(0, 0, .5);
			graphics.moveTo(-_size, -h);
			graphics.lineTo(0, -_size * .5 - h);
			graphics.lineTo(_size, -h);
			graphics.lineTo(0, _size * .5 - h);
			graphics.lineTo(-_size, -h);
			graphics.endFill();

			// draw left
			graphics.beginFill(leftShadow);
			graphics.lineStyle(0, 0, .5);
			graphics.moveTo(-_size, -h);
			graphics.lineTo(0, _size * .5 - h);
			graphics.lineTo(0, _size * .5);
			graphics.lineTo(-_size, 0);
			graphics.lineTo(-_size, -h);
			graphics.endFill();

			// draw right
			graphics.beginFill(rightShadow);
			graphics.lineStyle(0, 0, .5);
			graphics.moveTo(_size, -h);
			graphics.lineTo(0, _size * .5 - h);
			graphics.lineTo(0, _size * .5);
			graphics.lineTo(_size, 0);
			graphics.lineTo(_size, -h);
			graphics.endFill();
		}



	}
}